﻿using RiskMan.DataClass.Models.NotBasModels;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.Serialization;

namespace RiskMan.DataClass.Models.Gilevskiy
{
    /// <summary>
    /// Данные получаемые по определнному таймфрейму из базы данных
    /// </summary>
    [Serializable]
    public class RobotGilevskiyItem : INotifyPropertyChanged, ISerializable
    {
        #region private

        //Базовые настройки
        private bool _isRun;
        private string _account;
        private string _clientCode;
        private string _instrument;       
        private Guid _guidItem;

        //рабочие настройки робота
        
        private int _curPosition;
        private int _quantity;
        private string _condition;
        private bool _resultCondition;
        private string _resultConditionDitgit;
        private string _comment;
        private string _operation;
        private double _priceOpenPoz;
        private double _lastPrice;
        private ObservableCollection<TradesOpen> _TradeList;

        #endregion

        #region public

        #region Базовые настройки

        /// <summary>
        /// Торговый счет
        /// </summary>
        public string Account
        {
            get { return _account; }
            set
            {
                if (_account != value)
                {
                    _account = value;
                    RaisePropertyChanged("Account");
                }
            }
        }

        /// <summary>
        /// Счет депо
        /// </summary>
        public string ClientCode
        {
            get { return _clientCode; }
            set
            {
                if (_clientCode != value)
                {
                    _clientCode = value;
                    RaisePropertyChanged("ClientCode");
                }
            }
        }

        /// <summary>
        /// Торгуемый инструмент
        /// </summary>
        public string Instrument
        {
            get { return _instrument; }
            set
            {
                if (_instrument != value)
                {
                    _instrument = value;
                    RaisePropertyChanged("Instrument");
                }
            }
        }

        /// <summary>
        /// Запуск/остановка работы по данному инструменту
        /// </summary>
        public bool IsRun
        {
            get { return _isRun; }
            set
            {
                if (_isRun != value)
                {
                    _isRun = value;
                    RaisePropertyChanged("IsRun");
                }
            }
        }

        /// <summary>
        /// уникальный номер робота Жилевского, чтоб не терялся при сортировке
        /// </summary>
        public Guid GuidItem
        {
            get { return _guidItem; }
            set
            {
                if (_guidItem != value)
                {
                    _guidItem = value;
                    RaisePropertyChanged("GuidItem");
                }
            }
        }
        #endregion




        /// <summary>
        /// Количество контрактов/лотов, в одной выставляемой заявке
        /// </summary>
        public int Quantity
        {
            get { return _quantity; }
            set
            {
                if (_quantity != value)
                {
                    _quantity = value;
                    RaisePropertyChanged("Quantity");
                }
            }
        }

        /// <summary>
        /// текущая позиция по уровню и инструменту
        /// </summary>
        public int CurPosition
        {
            get { return _curPosition; }
            set
            {
                if (_curPosition != value)
                {
                    _curPosition = value;
                    RaisePropertyChanged("CurPosition");
                }
            }
        }


        /// <summary>
        /// Вид операции по инструменту
        /// </summary>
        public string Operation
        {
            get { return _operation; }
            set
            {
                if (_operation != value)
                {
                    _operation = value;
                    RaisePropertyChanged("Operation");
                }
            }
        }

        /// <summary>
        /// Цена открытия позиции
        /// </summary>
        public double PriceOpenPoz
        {
            get { return _priceOpenPoz; }
            set
            {
                if (_priceOpenPoz != value)
                {
                    _priceOpenPoz = value;
                    RaisePropertyChanged("PriceOpenPoz");
                }
            }
        }

        /// <summary>
        /// Цена последней сделки
        /// </summary>
        public double LastPrice
        {
            get { return _lastPrice; }
            set
            {
                if (_lastPrice != value)
                {
                    _lastPrice = value;
                    RaisePropertyChanged("LastPrice");
                }
            }
        }

        /// <summary>
        /// Описание условий для входа в позицию
        /// </summary>
        public string Condition
        {
            get { return _condition; }
            set
            {
                if (_condition != value)
                {
                    _condition = value;
                    RaisePropertyChanged("Condition");
                }
            }
        }

        /// <summary>
        /// Результат выполнения условий
        /// </summary>
        public bool ResultCondition
        {
            get { return _resultCondition; }
            set
            {
                if (_resultCondition != value)
                {
                    _resultCondition = value;
                    RaisePropertyChanged("ResultCondition");
                }
            }
        }

        /// <summary>
        /// Условия в формате цифр
        /// </summary>
        public string ResultConditionDitgit
        {
            get { return _resultConditionDitgit; }
            set
            {
                if (_resultConditionDitgit != value)
                {
                    _resultConditionDitgit = value;
                    RaisePropertyChanged("ResultConditionDitgit");
                }
            }
        }

        /// <summary>
        /// Комментарий к условиям
        /// </summary>
        public string Comment
        {
            get { return _comment; }
            set
            {
                if (_comment != value)
                {
                    _comment = value;
                    RaisePropertyChanged("Comment");
                }
            }
        }

        /// <summary>
        /// коллекция активнных и исполненных сделок на открытие и закрытие позиции
        /// </summary>
        public ObservableCollection<TradesOpen> TradeList
        {
            get { return _TradeList; }
            set
            {
                if (_TradeList != value)
                {
                    _TradeList = value;
                    RaisePropertyChanged("TradeList");
                }
            }
        }

        #endregion

        public RobotGilevskiyItem() { }

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        public RobotGilevskiyItem(SerializationInfo info, StreamingContext context)
        {
            IsRun = info.GetBoolean("IsRun");
            Account = info.GetString("Account");
            ClientCode = info.GetString("ClientCode");
            Instrument = info.GetString("Instrument");
            GuidItem = (Guid)info.GetValue("GuidItem", typeof(Guid));

            Quantity = info.GetInt32("Quantity");
            ////CurPosition = info.GetInt32("CurPosition");
            Operation = info.GetString("Operation");
            ////PriceOpenPoz = info.GetDouble("PriceOpenPoz");
            Condition = info.GetString("Condition");
            Comment = info.GetString("Comment");
            //TradeList = (ObservableCollection<TradesOpen>)info.GetValue("TradeList", typeof(ObservableCollection<TradesOpen>));
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("IsRun", IsRun);
            info.AddValue("Account", Account);
            info.AddValue("ClientCode", ClientCode);
            info.AddValue("Instrument", Instrument);
            info.AddValue("GuidItem", GuidItem);

            info.AddValue("Quantity", Quantity);
           // //info.AddValue("CurPosition", CurPosition);
            info.AddValue("Operation", Operation);
           //// info.AddValue("PriceOpenPoz", PriceOpenPoz);
            info.AddValue("Condition", Condition);
            info.AddValue("Comment", Comment);

            //info.AddValue("TradeList", TradeList);
        }
    }
}
